package org.tissou.server.Operations;

import org.tissou.client.Services.*;
import org.tissou.server.Base.Categorie;
import org.tissou.server.Utils.Variables_Globales;
import org.tissou.client.Services.MonException;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;


/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 11-Jan-2009
 * On utilise cette classe pour Quand on fait passer une dette en euro en une dette en pound
 * ou l'inverse.
 * To change this template use File | Settings | File Templates.
 */
public class Operation_TransfertMonnaie_Dette extends Operation_Base {

  ProprietaireInfos Crediteur;
  ProprietaireInfos Debiteur;
  MonnaieInfos Monnaie_Precedente;
  MonnaieInfos Monnaie_Suivante;
  Float Somme_Monnaie_Precedente;
  Float Somme_Monnaie_Suivante;
  Boolean Verifie;

  // Les comptes suivants sont des comptes virtuels uniquement.
  Compte Crediteur_Precedent;
  Compte Debiteur_Precedent;
  Compte Crediteur_Suivant;
  Compte Debiteur_Suivant;

  CategorieInfos Categorie;
  String Libelle_Crediteur;
  String Libelle_Debiteur;

  public Operation_TransfertMonnaie_Dette(Date date,
                                  ProprietaireInfos crediteur,
                                  ProprietaireInfos debiteur,
                                  MonnaieInfos monnaie_precedente,
                                  MonnaieInfos monnaie_suivante,
                                  Float somme_monnaie_precedente,
                                  Float somme_monnaie_suivante,
                                  Boolean verifie) {
    Date = date;
    Crediteur = crediteur;
    Debiteur = debiteur;
    Monnaie_Precedente = monnaie_precedente;
    Monnaie_Suivante = monnaie_suivante;
    Somme_Monnaie_Precedente = somme_monnaie_precedente;
    Somme_Monnaie_Suivante = somme_monnaie_suivante;
    Verifie = verifie;

    Crediteur_Precedent = crediteur.RenvoyerCompteVirtuel(Monnaie_Precedente);
    Debiteur_Precedent = debiteur.RenvoyerCompteVirtuel(Monnaie_Precedente);
    Crediteur_Suivant = crediteur.RenvoyerCompteVirtuel(Monnaie_Suivante);
    Debiteur_Suivant = debiteur.RenvoyerCompteVirtuel(Monnaie_Suivante);

    Categorie parent = Variables_Globales.Tout.rechercherCategorieDansDescendance("Transfert dette");
    Categorie = (parent.rechercherCategorieDansDescendance(String.format("%s vers %s",
        Monnaie_Precedente.getNomMonnaie(), Monnaie_Suivante.getNomMonnaie()))).getInfos();

    Libelle_Crediteur = String.format("%s me doit de largent en %s maintenant", Debiteur.getNom(),
        Monnaie_Suivante.getNomMonnaie());
    Libelle_Debiteur = String.format("Je dois de largent a %s en %s maintenant", Crediteur.getNom(),
        Monnaie_Suivante.getNomMonnaie());

    TypeTransaction_Nom = "Operation transfert monnaie dette";
  }

  private static boolean ConstruireAvecParametres_Compatibilite(Parametres parametres) {
    boolean resultat = true;
    resultat &= (parametres.NombreCategories() == 0);
    resultat &= (parametres.NombreProprietaires() == 2);
    resultat &= (parametres.NombreComptes() == 0);
    resultat &= (parametres.NombreLibelles() == 0);
    resultat &= (parametres.NombreMonnaies() == 2);
    resultat &= (parametres.NombreDettes() == 0);
    resultat &= (parametres.NombreSommes() == 2);
    return resultat;
  }
  /*
  Operation_TransfertMonnaieDette:
    Date Date = date;
    Boolean Verifie = verifie;
    OperationFactoryInfos.TypeOperation Typeoperation = OPERATION_TRANSFERTMONNAIEDETTE;

    List<CategorieInfos> Categories = void;
    List<ProprietaireInfos> Proprietaires = crediteur, debiteur;
    List<Compte> Comptes = void;
    List<String> Libelles = void;
    List<Dette> Dettes = void;
    List<MonnaieInfos> Monnaies = new ArrayList<MonnaieInfos>() = monnaie precedente, monnaie suivante;
    List<Float> Sommes = new ArrayList<Float>() = somme precedente, somme suivante;
  */ 
  private static Operation_TransfertMonnaie_Dette ConstruireAvecParametres_Construction(Parametres parametres) {
    return new Operation_TransfertMonnaie_Dette(parametres.getDate(),
        parametres.getProprietaires().get(0),
        parametres.getProprietaires().get(1),
        parametres.getMonnaies().get(0),
        parametres.getMonnaies().get(1),
        parametres.getSommes().get(0),
        parametres.getSommes().get(1),
        parametres.getVerifie()
        );
  }

  public static Operation_TransfertMonnaie_Dette ConstruireAvecParametres(Parametres parametres){
    if(ConstruireAvecParametres_Compatibilite(parametres)){
      return ConstruireAvecParametres_Construction(parametres);
    }
    else
      throw new MonException("Les parametres ne sont pas compatibles pour creer cette operation.");
  }


  public boolean Parametres_Compatibles(){
    if(Monnaie_Precedente.equals(Monnaie_Suivante)){
      throw new MonException("C'est la meme monnaie, ca ne va pas.");
    }
    if(Crediteur.equals(Debiteur)){
      throw new MonException("Le crediteur et le debiteur sont la meme personne, ca ne va pas.");
    }
    if(Somme_Monnaie_Precedente<0){
      throw new MonException("Le somme initiale est negative, ca ne va pas.");
    }
    if(Somme_Monnaie_Suivante<0){
      throw new MonException("Le somme finale est negative, ca ne va pas.");
    }
    return true;
  }

  public List<Transaction> Retourne_Transactions() {
    List<Transaction> AAjouter = new ArrayList<Transaction>();
    AAjouter.add(new Transaction(Date, Crediteur_Precedent, Categorie, Libelle_Crediteur, -Somme_Monnaie_Precedente,
        Verifie, Debiteur));
    AAjouter.add(new Transaction(Date, Debiteur_Precedent, Categorie, Libelle_Debiteur, Somme_Monnaie_Precedente,
        Verifie, Crediteur));
    AAjouter.add(new Transaction(Date, Crediteur_Suivant, Categorie, Libelle_Crediteur, Somme_Monnaie_Suivante,
      Verifie, Debiteur));
    AAjouter.add(new Transaction(Date, Debiteur_Suivant, Categorie, Libelle_Debiteur, -Somme_Monnaie_Suivante,
        Verifie, Crediteur));
    return AAjouter;
  }
}
